package com.southwind.phone_store_demohd.service.impl;


import com.southwind.phone_store_demohd.dto.OrderDTO;
import com.southwind.phone_store_demohd.entity.OrderMaster;
import com.southwind.phone_store_demohd.entity.PhoneInfo;
import com.southwind.phone_store_demohd.entity.PhoneSpecs;
import com.southwind.phone_store_demohd.enums.PayStatusEnum;
import com.southwind.phone_store_demohd.enums.ResultEnum;
import com.southwind.phone_store_demohd.exception.PhoneException;
import com.southwind.phone_store_demohd.repository.OrderMasterRepository;
import com.southwind.phone_store_demohd.repository.PhoneInfoRepository;
import com.southwind.phone_store_demohd.repository.PhoneSpecsRepository;
import com.southwind.phone_store_demohd.service.OrderService;
import com.southwind.phone_store_demohd.service.PhoneService;
import com.southwind.phone_store_demohd.util.KeyUtil;
import com.southwind.phone_store_demohd.vo.OrderDetailVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.math.BigDecimal;

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {

    @Autowired
    private PhoneSpecsRepository phoneSpecsRepository;//规格表
    @Autowired
    private PhoneInfoRepository phoneInfoRepository;//手机商品详情表
    @Autowired
    private OrderMasterRepository orderMasterRepository;//订单表
    @Autowired
    private PhoneService phoneService;//把主页的接口放进来，用来改库存


    /*
    * 这里都是把数据都提交给OrderMaster模型，这个是订单详情表
    * 订单详情表里面用到了     规格表      手机商品详情表    地址表
    * */
    @Override
    public OrderDTO create(OrderDTO orderDTO) {
        //地址表给订单表
        OrderMaster orderMaster = new OrderMaster();
        BeanUtils.copyProperties(orderDTO,orderMaster);//这里是吧orderDTO相同的属性直接赋值给了orderMaster



        //规格表通过地址表的id查找到数据给订单表
        //orderDTO这个里面有用户传递过来的规格id
        //这里PhoneSpecs拿到用户选择的sku页面的数据
        PhoneSpecs phoneSpecs = phoneSpecsRepository.findById(orderDTO.getSpecsId()).get();
        if(phoneSpecs == null){
            log.error("【创建订单】规格不存在,phoneSpecs={}",phoneSpecs);
            throw new PhoneException(ResultEnum.SPECS_NOT_EXIST);
        }
        BeanUtils.copyProperties(phoneSpecs,orderMaster);//再把phoneSpecs相同的属性给了orderMaster



        //手机商品详情表通过规格表的id查找到数据给订单表
        PhoneInfo phoneInfo = phoneInfoRepository.findById(phoneSpecs.getPhoneId()).get();
        if(phoneInfo == null){
            log.error("【创建订单】手机不存在,phoneInfo={}",phoneInfo);
            throw new PhoneException(ResultEnum.PHONE_NOT_EXIST);
        }
        BeanUtils.copyProperties(phoneInfo,orderMaster);//再把phoneInfo相同的属性给了orderMaster






        //计算总价
        BigDecimal orderAmount = new BigDecimal(0);
        /*单价价格拿出来
        * .divide是除以
        * .multiply是乘法
        * .add加法
        * 乘以用户买的数量，算出总价*/
        orderAmount = phoneSpecs.getSpecsPrice().divide(new BigDecimal(100))
                .multiply(new BigDecimal(orderDTO.getPhoneQuantity()))
                .add(orderAmount)
                .add(new BigDecimal(10));
        orderMaster.setOrderAmount(orderAmount);//总价也给订单表了



        //orderId
        //这里要给订单id，订单id要用随机数来生成，就用util包下面的KeyUtil类来实现
        orderMaster.setOrderId(KeyUtil.createUniqueKey());
        orderDTO.setOrderId(orderMaster.getOrderId());//把订单表里面的id传递给用户的模型里面


        //payStatus
        //定义枚举判断是否以支付
        orderMaster.setPayStatus(PayStatusEnum.UNPIAD.getCode());//是否以支付也传递给订单表了


        //就把订单模型传递给数据库了
        orderMasterRepository.save(orderMaster);

        //用来减库存，把要改库存的id传进去，再把购买的数量传进去
        phoneService.subStock(orderDTO.getSpecsId(),orderDTO.getPhoneQuantity());

        return orderDTO;
    }







    //根据订单id从数据库找到数据，然后返回给前端
    @Override
    public OrderDetailVO findOrderDetailByOrderId(String orderId) {
        OrderDetailVO orderDetailVO = new OrderDetailVO();//创建给前端的模型

        //根据订单id取出订单数据
        OrderMaster orderMaster = orderMasterRepository.findById(orderId).get();

        //订单数据为空的话抛出异常，订单不存在
        if(orderMaster == null){
            log.error("【查询订单】订单不存在,orderMaster={}",orderMaster);
            throw new PhoneException(ResultEnum.ORDER_NOT_EXIST);//显示订单不存在
        }

        BeanUtils.copyProperties(orderMaster,orderDetailVO);//把订单数据相同的属性传递给orderDetailVO前端需要的模型
        orderDetailVO.setSpecsPrice(orderMaster.getSpecsPrice().divide(new BigDecimal(100))+".00");//把价格单独给一次，前端用的字符串

        return orderDetailVO;//给前端返回一个前端模型
    }






    // 根据订单id，给前端返回数据
    @Override
    public String pay(String orderId) {
        //通过订单id找到订单详情里面的数据
        OrderMaster orderMaster = orderMasterRepository.findById(orderId).get();


        if(orderMaster == null){
            log.error("【支付订单】订单不存在,orderMaster={}",orderMaster);
            throw new PhoneException(ResultEnum.ORDER_NOT_EXIST);
        }

        //查出来有订单的话，说明支付成功了
        //如果订单里面的支付状态为未支付的话，就把另外一个支付成功的枚举传递给订单详情里面
        if(orderMaster.getPayStatus().equals(PayStatusEnum.UNPIAD.getCode())){
            orderMaster.setPayStatus(PayStatusEnum.PAID.getCode());//支付成功的枚举传递给订单详情里面
            orderMasterRepository.save(orderMaster);//再把订单详情传递给数据库
        } else {//如果本来就是支付成功的话，那就抛出异常提示订单已经支付
            log.error("【支付订单】订单已支付,orderMaster={}",orderMaster);
        }

        return orderId;
    }
}
